package com.android.cherryboard;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.android.cherryboard.Utility.Utility;
import com.android.cherryboard.fbclass.BaseDialogListener;

public class FriendsList extends Activity implements OnItemClickListener {
   private Handler mHandler;

   protected ListView friendsList;
   protected static JSONArray jsonArray;
   protected String graph_or_fql;

   /*
    * Layout the friends' list
    */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       mHandler = new Handler();
       setContentView(R.layout.friends_list);

       Bundle extras = getIntent().getExtras();
       String apiResponse = extras.getString("API_RESPONSE");
       graph_or_fql = extras.getString("METHOD");
       try {
           if (graph_or_fql.equals("graph")) {
               jsonArray = new JSONObject(apiResponse).getJSONArray("data");
           } else {
               jsonArray = new JSONArray(apiResponse);
           }
       } catch (JSONException e) {
           showToast("Error: " + e.getMessage());
           return;
       }
       friendsList = (ListView) findViewById(R.id.friends_list);
       friendsList.setOnItemClickListener(this);
       friendsList.setAdapter(new FriendListAdapter(this));

       
       
       TextView tvTitle = (TextView)this.findViewById(R.id.txt_header_cherryfull);
       Typeface tfTitle = Typeface.createFromAsset(this
               .getAssets(), "font/title_font.ttf");

       tvTitle.setTypeface(tfTitle);

       showToast(getString(R.string.can_post_on_wall));
   }

   /*
    * Clicking on a friend should popup a dialog for user to post on friend's
    * wall.
    */
   @Override
   @SuppressWarnings("deprecation")
   public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
       try {
           final long friendId;
           if (graph_or_fql.equals("graph")) {
               friendId = jsonArray.getJSONObject(position).getLong("id");
           } else {
               friendId = jsonArray.getJSONObject(position).getLong("uid");
           }
           String name = jsonArray.getJSONObject(position).getString("name");

           new AlertDialog.Builder(this).setTitle(R.string.post_on_wall_title)
                   .setMessage(String.format(getString(R.string.post_on_wall), name))
                   .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                       @Override
                       public void onClick(DialogInterface dialog, int which) {
                           Bundle params = new Bundle();
                           /*
                            * Source Tag: friend_wall_tag To write on a friend's wall, 
                            * provide friend's UID in the 'to' parameter.
                            * More info on feed dialog:
                            * https://developers.facebook.com/docs/reference/dialogs/feed/
                            */
                           params.putString("to", String.valueOf(friendId));
                           params.putString("caption", getString(R.string.app_name));
                           params.putString("description", "Hi This is dec");
                           params.putString("picture", Utility.HACK_ICON_URL);
                           params.putString("name", getString(R.string.app_action));
                           Utility.mFacebook.dialog(FriendsList.this, "feed", params,
                                   new PostDialogListener());
                       }

                   }).setNegativeButton("No", null).show();
       } catch (JSONException e) {
           showToast("Error: " + e.getMessage());
       }
   }

   /*
    * Callback after the message has been posted on friend's wall.
    */
   public class PostDialogListener extends BaseDialogListener {
       @Override
       public void onComplete(Bundle values) {
           final String postId = values.getString("post_id");
           if (postId != null) {
               showToast("Message posted on the wall.");
           } else {
               showToast("No message posted on the wall.");
           }
       }
   }

   public void showToast(final String msg) {
       mHandler.post(new Runnable() {
           @Override
           public void run() {
               Toast toast = Toast.makeText(FriendsList.this, msg, Toast.LENGTH_LONG);
               toast.show();
           }
       });
   }

   /**
    * Definition of the list adapter
    */
   public class FriendListAdapter extends BaseAdapter {
       private LayoutInflater mInflater;
       FriendsList friendsList;

       public FriendListAdapter(FriendsList friendsList) {
           this.friendsList = friendsList;
           if (Utility.model == null) {
               Utility.model = new FriendsGetProfilePics();
           }
           Utility.model.setListener(this);
           mInflater = LayoutInflater.from(friendsList.getBaseContext());
       }

       @Override
       public int getCount() {
           return jsonArray.length();
       }

       @Override
       public Object getItem(int position) {
           return null;
       }

       @Override
       public long getItemId(int position) {
           return 0;
       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
           JSONObject jsonObject = null;
           try {
               jsonObject = jsonArray.getJSONObject(position);
           } catch (JSONException e1) {
               e1.printStackTrace();
           }
           View hView = convertView;
           if (convertView == null) {
               hView = mInflater.inflate(R.layout.friend_item, null);
               ViewHolder holder = new ViewHolder();
               holder.profile_pic = (ImageView) hView.findViewById(R.id.profile_pic);
               holder.name = (TextView) hView.findViewById(R.id.name);
               holder.info = (TextView) hView.findViewById(R.id.info);
               hView.setTag(holder);
           }

           ViewHolder holder = (ViewHolder) hView.getTag();
           try {
               if (graph_or_fql.equals("graph")) {
                   holder.profile_pic.setImageBitmap(Utility.model.getImage(
                           jsonObject.getString("id"), jsonObject.getString("picture")));
               } else {
                   holder.profile_pic.setImageBitmap(Utility.model.getImage(
                           jsonObject.getString("uid"), jsonObject.getString("pic_square")));
               }
           } catch (JSONException e) {
               holder.name.setText("");
           }
           try {
               holder.name.setText(jsonObject.getString("name"));
           } catch (JSONException e) {
               holder.name.setText("");
           }
           try {
               if (graph_or_fql.equals("graph")) {
                   holder.info.setText(jsonObject.getJSONObject("location").getString("name"));
               } else {
                   JSONObject location = jsonObject.getJSONObject("current_location");
                   holder.info.setText(location.getString("city") + ", "
                           + location.getString("state"));
               }

           } catch (JSONException e) {
               holder.info.setText("");
           }
           return hView;
       }

   }

   class ViewHolder {
       ImageView profile_pic;
       TextView name;
       TextView info;
   }
}
